using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FiltronASP.Logger;

namespace FiltronASP.Models.DAO
{
    public class PageTypeDAO : Abstracts.AbstractGenericDAO<PageType, System.Nullable<int>>,
        Interfaces.IPageTypeDAO
    {
        /// <summary>
        /// Metoda zwracajaca nazwe parametru bedacego kluczem glownym tabeli.
        /// </summary>
        /// <returns>nazwa klucza glownego</returns>
        protected override string GetKeyProperty()
        {
            return "page_type_id";
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <returns>Lista rekordów o zadanym języku</returns>
        public IQueryable<PageType> FindByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<PageType> pageTypes = this._cmsEntitiesDataContext.PageTypes.Where(
                    lang => lang.language_id.Equals(languageId)
                        );
                // );
                if (!(pageTypes.Any()))
                {
                    return null;
                }   //if
                return pageTypes;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Wstawianie listy obiektów na podstawie jezyka.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        public bool InsertForNewLanguage(int defaultLanguageId, int newLanguageId)
        {
            if (defaultLanguageId.Equals(0) || newLanguageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<PageType> pageTypes = this.FindByLanguage(defaultLanguageId);
                if (pageTypes == null)
                {
                    return true;
                }   //if
                if (!(pageTypes.Any()))
                {
                    return true;
                }   //if
                foreach(PageType page in pageTypes)
                {
                    PageType pageTypeToInsert = new PageType();
                    pageTypeToInsert.language_id = newLanguageId;
                    pageTypeToInsert.page_type_abbr = page.page_type_abbr;
                    pageTypeToInsert.page_type_created = DateTime.Now;
                    pageTypeToInsert.page_type_description = page.page_type_description;
                    pageTypeToInsert.page_type_editable = page.page_type_editable;
                    pageTypeToInsert.page_type_link = page.page_type_link;
                    pageTypeToInsert.page_type_modified = DateTime.Now;
                    pageTypeToInsert.page_type_name = page.page_type_name;
                    this.Add(pageTypeToInsert);
                }
                
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return true;
        }



        /// <summary>
        /// Pobieranie listy obiektów na podstawie skrótu.
        /// </summary>
        /// <param name="pageTypeAbbr">skrót</param>
        /// <returns>Lista rekordów o zadanym skrócie</returns>
        public IQueryable<PageType> FindByAbbr(string pageTypeAbbr)
        {
            if (String.IsNullOrEmpty(pageTypeAbbr))
            {
                return null;
            }   //if
            try
            {
                IQueryable<PageType> pageTypes = this._cmsEntitiesDataContext.PageTypes.Where(
                    page => page.page_type_abbr.Equals(pageTypeAbbr)
                );
                if (!(pageTypes.Any()))
                {
                    return null;
                }   //if
                return pageTypes;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów o pustym skrócie.
        /// </summary>
        /// <returns>Listę rekordów o pustym skrócie.</returns>
        public IQueryable<PageType> FindByAbbrNull()
        {
            try
            {
                IQueryable<PageType> pageTypes = this._cmsEntitiesDataContext.PageTypes.Where(
                    page => String.IsNullOrEmpty(page.page_type_abbr)
                        );
                if (!(pageTypes.Any()))
                {
                    return null;
                }   //if
                return pageTypes;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie skrótu i języka.
        /// </summary>
        /// <param name="pageTypeAbbr">skrót</param>
        /// <param name="languageId">język</param>
        /// <returns>Lista rekordów o zadanym skrócie i języku</returns>
        public IQueryable<PageType> FindByAbbrAndLanguage(string pageTypeAbbr, int languageId)
        {
            if (String.IsNullOrEmpty(pageTypeAbbr) || languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<PageType> pageTypes = this._cmsEntitiesDataContext.PageTypes.Where(
                    page => page.page_type_abbr.Equals(pageTypeAbbr) && page.language_id.Equals(languageId)
                );
                if (!(pageTypes.Any()))
                {
                    return null;
                }   //if
                return pageTypes;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie obiektu na podstawie nazwy i języka.
        /// </summary>
        /// <param name="pageTypeName">nazwa</param>
        /// <param name="languageId">język</param>
        /// <returns>Rekord o zadanej nazwie i języku</returns>
        public PageType FindByNameAndLanguage(string pageTypeName, int languageId)
        {
            if (String.IsNullOrEmpty(pageTypeName) || languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                PageType pageType = this._cmsEntitiesDataContext.PageTypes.First(
                    page => page.page_type_name.Equals(pageTypeName) && page.language_id.Equals(languageId)
                );
                return pageType;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie nazwy, języka i o innym id niż zadane.
        /// </summary>
        /// <param name="pageTypeName">nazwa</param>
        /// <param name="languageId">język</param>
        /// <param name="pageTypeId">typ strony</param>
        /// <returns>Lista rekordów o zadanej nazwie, języku i o innym id niż zadane</returns>
        public IQueryable<PageType> FindByNameAndLanguageAndNoPageTypeId(string pageTypeName, int languageId, int pageTypeId)
        {
            if (String.IsNullOrEmpty(pageTypeName) || languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<PageType> pageTypes = this._cmsEntitiesDataContext.PageTypes.Where(
                    page => page.page_type_name.Equals(pageTypeName) && page.language_id.Equals(languageId)
                        && !page.page_type_id.Equals(pageTypeId)
                );
                if (!(pageTypes.Any()))
                {
                    return null;
                }   //if
                return pageTypes;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie maksymalnego id elemntu.
        /// </summary>
        /// <returns>maksymalny numer id elementu.</returns>
        public int SelectMaxId()
        {
            try
            {
                int max = this._cmsEntitiesDataContext.PageTypes.Max(pt => pt.page_type_id);
                return max;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return -1;
        }

        /// <summary>
        /// Usuwanie obiektow po jezyku.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <returns>true dla sukcesu, false w przeciwnym razie</returns>
        public bool DeleteByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<PageType> pageTypes = this.FindByLanguage(languageId);
                if (pageTypes == null)
                {
                    return true;
                }   //if
                if (!(pageTypes.Any()))
                {
                    return true;
                }   //if
                foreach (PageType pety in pageTypes)
                {
                    this._cmsEntitiesDataContext.PageTypes.DeleteOnSubmit(pety);
                }
                try
                {
                    _cmsEntitiesDataContext.SubmitChanges();

                }
                catch (Exception ex)
                {
                    MyLogger.Log(ex);
                }   //catch
                return true;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return false;
        }
    }
}
